package com.caocaog.market.data.transfer.service.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.caocaog.market.data.transfer.entity.CcAgent;
import com.caocaog.market.data.transfer.entity.MkSiteArea;
import com.caocaog.market.data.transfer.entity.MkSiteBasic;
import com.caocaog.market.data.transfer.entity.SiteAreaSimple;
import com.caocaog.market.data.transfer.mapper.MkSiteBasicMapper;
import com.caocaog.market.data.transfer.service.MkSiteAreaService;
import com.caocaog.market.data.transfer.service.MkSiteBasicService;
import com.caocaog.market.util.DistanceUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

import static java.util.Comparator.comparing;

/**
 * @author liguang
 * @version 1.0.0
 * @Project jeecg-boot
 * @Package com.caocaog.market.data.transfer.service.impl
 * @ClassName MkSiteBasicServiceImpl.java
 * @createTime 2021年11月16日 10:07:00
 * @Description TODO
 */
@Slf4j
@Service
public class MkSiteBasicServiceImpl extends ServiceImpl<MkSiteBasicMapper, MkSiteBasic> implements MkSiteBasicService {
    @Autowired
    private MkSiteAreaService siteAreaService;

    @Override
    public IPage<MkSiteBasic> findAllSiteByNow(Page<MkSiteBasic> page, MkSiteBasic mkSiteBasic) {
        return super.getBaseMapper().findAllSiteByNow(page, mkSiteBasic);
    }

    @Override
    public List<MkSiteBasic> findAllSiteForNoPage(MkSiteBasic mkSiteBasic) {
        return super.getBaseMapper().findAllSiteByNow(mkSiteBasic);
    }

    @Override
    public int countForfindAllSiteByNow(MkSiteBasic mkSiteBasic) {
        return super.getBaseMapper().countForfindAllSiteByNow(mkSiteBasic);
    }

    @Override
    public String insertForReplace(List<CcAgent> agents) {
        LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        int insertSuc = 0, checkNum = 0;
        for (CcAgent agent : agents) {
            MkSiteBasic mkSiteBasic = new MkSiteBasic();
            int num = super.getBaseMapper().countForfindAllSiteByNow(mkSiteBasic.setPtAgentId(agent.getSid()));
            // 先根据sqlserver库中的代理商id去mysql库中查询该分站是否存在，如果存在则执行update操作，如果不存在则进行insert操作
            if (num > 0) {
                // 查询信息有没有被更改
                mkSiteBasic.setSiteType(agent.getAgentType());
                mkSiteBasic.setName(agent.getName());
                mkSiteBasic.setContactPerson(agent.getAliname());
                mkSiteBasic.setMobile(agent.getAlipay());
                int isUpdate = super.getBaseMapper().countForfindAllSiteByNow(mkSiteBasic);
                if (isUpdate > 0) {
                    // 分站已经存在，分站信息没有被修改，不需要执行update操作，直接结束本次循环即可
                    continue;
                }
                // 分站已经存在，分站关键信息被修改过；此时执行update操作；
                UpdateWrapper<MkSiteBasic> siteUpdateWrapper = new UpdateWrapper<MkSiteBasic>();
                siteUpdateWrapper.set("site_type", agent.getAgentType());
                siteUpdateWrapper.set("name", agent.getName());
                siteUpdateWrapper.set("contact_person", agent.getAliname());
                siteUpdateWrapper.set("mobile", agent.getAlipay());
                siteUpdateWrapper.set("update_by", currentUser.getUsername());
                siteUpdateWrapper.set("update_time", new Date());
                siteUpdateWrapper.eq("pt_agent_id", agent.getSid());
                checkNum = checkNum + super.getBaseMapper().update(null, siteUpdateWrapper);
            } else {
                // 分站不存在,直接插入
                mkSiteBasic.setPtAgentId(agent.getSid());
                mkSiteBasic.setSiteType(agent.getAgentType());
                mkSiteBasic.setName(agent.getName());
                mkSiteBasic.setContactPerson(agent.getAliname());
                mkSiteBasic.setMobile(agent.getAlipay());
                // 执行向mysql库中的mk_site_basic表插入的逻辑
                mkSiteBasic.setId(String.valueOf(new DefaultIdentifierGenerator().nextId(mkSiteBasic)));
                mkSiteBasic.setCreateBy(currentUser.getUsername());
                mkSiteBasic.setCreateTime(new Date());
                insertSuc = insertSuc + super.getBaseMapper().insertForReplace(mkSiteBasic);
            }
        }
        return "总共执行成功" + (checkNum + insertSuc) + "条数据；其中：新转移数据（含被修改的数据）" + insertSuc + "条，新库中已存在需要修改的有" + checkNum + "条。";
    }

    @Override
    public int siteSet(MkSiteBasic mkSiteBasic) {
        return super.getBaseMapper().siteSet(mkSiteBasic);
    }


    @Override
    public MkSiteArea getSurroundingSiteIdByMap(String lat, String lng) {
        // 系统中的分站只有三级，分别是 3县级代理、4乡镇级代理、2市级代理
//        return this.siteAreaService.getSiteAreaByDistrictAdCode(parseLocation(lat, lng));
        return this.siteAreaService.getSiteAreaByDistrictAdCode("1462979923839545346");
    }

    private static String parseLocation(String lat, String lng) {
        // https://lbs.amap.com/api/webservice/guide/api/georegeo 逆地址解析
        // amap_api 注册高德地图开发者，创建应用，获取apikey
        //测试key:8f21643950153e066e4bfefc3d244e19
        String key = "b8cc0845009644ee5e331702ca73249a";
        String url = "https://restapi.amap.com/v3/geocode/regeo?location=" + lng + "," + lat + "&key=" + key + "&radius=1000&extensions=all";
        log.info("url: " + url);
        String jsonData = HttpUtil.get(url);
        JSONObject jsonLocation = JSONUtil.parseObj(jsonData);
        if (!"1".equals(jsonLocation.getStr("status"))) {
            throw new JeecgBootException("请求高德地图获取定位信息失败");
        }
        JSONObject addressComponent = jsonLocation.getJSONObject("regeocode").getJSONObject("addressComponent");
        log.info(addressComponent.toString());
        return (String) addressComponent.get("adcode");
    }

    /**
     * 曹操小店要求的定死分站，也就是SiteID为 1462979923839545346 的分站信息，后续若有其他需求就直接修改该分站的基础信息，而不是创建其他的分站。
     * @param lat 纬度
     * @param lng 经度
     * @return 创建的默认分站
     */
    @Override
    public SiteAreaSimple getSurroundingSiteId(String lat, String lng) {
        return new SiteAreaSimple().setSiteId("1462979923839545346");
    }

    /**
     * 根据经纬度获取到注册分站信息，不过与目前需求不符，暂且废弃
     *
     * @param lat 经度
     * @param lng 纬度
     * @return 获取到的分站简单信息
     * @since 曹操来了
     */
    @Deprecated
    public SiteAreaSimple getSurroundingSiteIdSource(String lat, String lng) {
        log.info("lat = " + lat + ", lng = " + lng);
        if (StringUtils.isBlank(lat) || StringUtils.isBlank(lng)) {
            throw new JeecgBootException("请检查是否给小程序开启了定位权限");
        }
        double latDouble = Double.parseDouble(lat);
        double lngDouble = Double.parseDouble(lng);
        List<SiteAreaSimple> siteAreaSimpleList = this.siteAreaService.selectSiteAreaList();
        // 根据分站类型（siteType，先暂存于siteArea的siteName中），过滤同分站类型相同的中心点（就是经纬度），减少距离对比次数
        Optional<SiteAreaSimple> firstSiteArea = siteAreaSimpleList.stream().min(comparing(siteArea -> {
            double distance = DistanceUtil.getDistanceMeter(
                    latDouble, lngDouble, siteArea.getCenter()[1], siteArea.getCenter()[0]);
            return Double.parseDouble(String.format("%.2f", distance));
        }));

        if (firstSiteArea.isPresent()) {
            log.info(firstSiteArea.get().toString());
            return firstSiteArea.get();
        }
        throw new JeecgBootException("根据经纬度获取周边最近的分站id失败");
    }
}
